/*******************************************************************************
 * Copyright (c) 2007, Geophysical Center RAS
 * Sergey Berezin, Dmitry Voitsekhovskiy
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms,
 * with or without modification, are permitted provided
 * that the following conditions are met:
 *
 * - Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 *
 * - Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 *
 * - Neither the name of the Geophysical Center RAS nor the names
 * of its contributors may be used to endorse or promote products
 * derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
 * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 ******************************************************************************/
using System;
using VisualEsse.DataEngine.Types;

namespace VisualEsse.DataEngine
{
    public class EsseWebServiceDataProvider : DataProvider
    {
        /// <summary>
        /// Cache stores arrays for each pair (time, parameter).
        /// </summary>
        private ICache cache;

        private string dataServiceUrl;
        private string resourceName;
        private string dataSource;

        public EsseWebServiceDataProvider(string homeDirectory)
            : this(homeDirectory, VisualEsse.DataEngine.Properties.Settings.Default.DataServiceUrl,
                    "EsseResource", VisualEsse.DataEngine.Properties.Settings.Default.DataSource)
        {            
        }

        public EsseWebServiceDataProvider(string homeDirectory, string dataServiceUrl, string resource, string dataSource)
            : base(homeDirectory, false)
        {
            metadataProvider = EsseMetadataProvider.CreateEsseMetadataProvider(homeDirectory, dataServiceUrl, resource, dataSource);

            // Initializing cache with its limitation by 200 Mb. 
            string cacheDirectory = (homeDirectory == null) ? ("Cache") :
                (System.IO.Path.Combine(homeDirectory, @"Cache"));
            cache = new EsseParametersCache(cacheDirectory, 200 * 1024 * 1024);

            this.dataServiceUrl = dataServiceUrl;
            this.resourceName = resource;
            this.dataSource = dataSource;
        }

        public string DataServiceUrl
        {
            get { return dataServiceUrl; }
        }

        public string ResourceName
        {
            get { return resourceName; }
        }

        public string DataSourceString
        {
            get { return dataSource; }
        }

        public ICache Cache
        {
            get { return cache; }
        }

        public override IGrid2dDataSource CreateDataSource(EsseParameterDescription parameter, DateTime when)
        {
            if (parameter.Dimension == 1)
            {
                if (this.ResourceName == "EsseCdmResource")
                    return new CDMDataSource(this, parameter, GridMin, GridMax, when);

                return new EsseWebServiceDataSource(this, parameter, GridMin, GridMax, when);
            }
            else if (parameter.Dimension == 2)
            {
                return new VirtualParameterVector2dDataSource(this, parameter, GridMin, GridMax, when);
            }
            else
            {
                System.Windows.Forms.MessageBox.Show("Virtual parameter with dimension greater than 2 are not supported");
                return null;
            }
        }

        public override void Dispose()
        {
            base.Dispose();
            if(cache != null)
                cache.Dispose();
        }
    }

}
